#pragma once
#include <mutex>
#include <string>
#include <fstream>
#include "option/config.h"
namespace boltDB {
class DiskManager {
 public:
  /**
   * 对于一个db文件名创建一个新的磁盘管理器
   * @param db_file 打开的文件名
   */
  explicit DiskManager(const std::string &db_file);

  DiskManager() = default;

  virtual ~DiskManager() = default;

  /**
   * 关闭磁盘管理器并回收所有资源
   */
  void ShutDown();

  /**
   * 向页内写入数据
   * @param page_id 页id
   * @param page_data 要写入的数据
   */
  virtual void WritePage(page_id_t page_id, const char *page_data);

  /**
   * 从页中读取数据.
   * @param page_id 页id
   * @param[out] page_data 输出的缓冲区
   */
  virtual void ReadPage(page_id_t page_id, char *page_data);


  // /** @return 返回磁盘刷新的次数 */
  // auto GetNumFlushes() const -> int;

  // /** @return 如果内容还没有被刷入磁盘就返回true */
  // auto GetFlushState() const -> bool;

  // /** @return 返回写入数据的数量 */
  // auto GetNumWrites() const -> int;

 protected:
  auto GetFileSize(const std::string &file_name) -> int;
  // 写入到数据库文件的流
  std::fstream db_io_;
  std::string file_name_;
  //并发支持
  std::mutex db_io_latch_;
};

}